/**
 * 299. 猜数字游戏（与 面试题 16.15. 珠玑妙算 同）
 */
public class Solutions_299 {
    public static void main(String[] args) {
//        String secret = "1807", guess = "7810";  // output: "1A3B"
        String secret = "1123", guess = "0111";  // output: "1A1B"

        String result = getHint(secret, guess);
        System.out.println(result);
    }

    public static String getHint(String secret, String guess) {
        // 建立哈希数组：map1[8] = 2，表示数值 8 在字符串 secret 中出现了 2 次
        int[] map1 = new int[10];
        int[] map2 = new int[10];
        // "公牛"，即猜中的次数
        int bulls = 0;
        // 总共猜对的数字次数
        int count = 0;

        for (int i = 0; i < secret.length(); i++) {
            char s = secret.charAt(i);
            char g = guess.charAt(i);
            if (s == g) {
                // 记录下“猜中”的次数
                bulls ++;
            }
            map1[s - '0'] ++;
            map2[g - '0'] ++;
        }
        for (int i = 0; i < map1.length; i++) {
            if (map1[i] != 0 && map2[i] != 0) {
                // 最少有 count 个字符相同
                count += Math.min(map1[i], map2[i]);
            }
        }
        // 伪猜中次数 = 总猜对次数 - 猜中的次数
        StringBuilder sb = new StringBuilder();
        sb.append(bulls);
        sb.append("A");
        sb.append(count - bulls);
        sb.append("B");
        return sb.toString();
    }
}
